package com.juyu.miliao.api.util;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;

public class OSSAssumeRole {
	// 目前只有"cn-hangzhou"这个region可用, 不要使用填写其他region的值
	public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
	public static final String STS_API_VERSION = "2015-04-01";

	public static final String ACCESSKEY_ID = "LTAINKmQtl1V0nXv";
	public static final String ACCESSKEY_SECRET = "mVMmMo3OLidDQImndVbNf54CGcNp25";
	//表示的是需要扮演的角色ID，角色的ID可以在 角色管理 > 角色详情 中找到。
	public static final String ROLEARN = "acs:ram::1556475034117644:role/aliyunosstokengeneratorrole";
	//一个用来标示临时凭证的名称，一般来说建议使用不同的应用程序用户来区分
	public static final String ROLE_SESSION_NAME = "external-username";
	//临时凭证的有效期，单位是s，最小为900，最大为3600。
	public static final long DURATION_SECONDS = 3600;
	//扮演角色的时候额外加上的一个权限限制
	public static final String policy = "{\"Statement\": [{\"Action\": [\"oss:*\"],\"Effect\": \"Allow\",\"Resource\": [\"acs:oss:*:*:*\"]}],\"Version\": \"1\"}";

	public static AssumeRoleResponse assumeRole() throws ServerException, ClientException{
		// 创建一个 Aliyun Acs Client, 用于发起 OpenAPI 请求
		IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, ACCESSKEY_ID, ACCESSKEY_SECRET);
		DefaultAcsClient client = new DefaultAcsClient(profile);

		// 创建一个 AssumeRoleRequest 并设置请求参数
		final AssumeRoleRequest request = new AssumeRoleRequest();
		request.setVersion(STS_API_VERSION);
		request.setMethod(MethodType.POST);
		request.setProtocol(ProtocolType.HTTPS);

		request.setRoleArn(ROLEARN);
		request.setRoleSessionName(ROLE_SESSION_NAME);
		request.setPolicy(policy);
		request.setDurationSeconds(DURATION_SECONDS);
		// 发起请求，并得到response
		final AssumeRoleResponse response = client.getAcsResponse(request);
		return response;

	}
}
